package tech.aistar.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import tech.aistar.entity.LoginFormVo;
import tech.aistar.entity.User;
import tech.aistar.entity.UserDTO;
import tech.aistar.mapper.UserMapper;
import tech.aistar.service.UserService;
import tech.aistar.util.*;

/**
 * 本类用来演示:
 *
 * @author jyz
 * @date 2023/3/11 18:36:18
 */
@Service
public class UserServiceImpl implements UserService {

    private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);

    @Resource
    private UserMapper userMapper;

    @Override
    public Result sendCode(String phone, HttpSession session) {
        // 1. 效验手机号格式是否正确
        Boolean checkResult = TelephoneFormat.checkPhone(phone);
        // 2. 效验失败，返回手机号格式有误
        if(!checkResult){
            return Result.fail("手机格式有误!");
        }
        // 3. 正确  --->  则随机生成6位的验证码
        String code = RandomUtil.randomNumbers(4);
        // 4. 将验证码存到session中
        session.setAttribute(Constant.LOGIN_CODE,code);
        // 5. 如果有第三方接口，则发送验证码
        SendInfo.sendCode(phone,code);
        log.info("发送的验证码为：" + code);
        // 6. 返回结果
        return Result.ok();
    }

    @Override
    public Result login(LoginFormVo loginFormVo, HttpSession session) {
        // 1. 效验手机号格式是否正确
        String phone = loginFormVo.getPhone();
        Boolean checkResult = TelephoneFormat.checkPhone(phone);
        // 2. 效验失败，返回手机号格式有误
        if(!checkResult){
            return Result.fail("手机格式有误!");
        }
        // 3. 正确  ---> 从session中取出验证码
        String code = (String) session.getAttribute(Constant.LOGIN_CODE);
        log.info("login_session中的验证码为：" + session.getAttribute(Constant.LOGIN_CODE));
        // 4. 判断验证码是否正确
        if(code == null || !code.equals(loginFormVo.getCode())){
            // 5. 不正确  --> 返回
            return Result.fail("验证码不正确!");
        }
        // 6. 正确  --->  通过手机号查询用户是否存在
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("phone",loginFormVo.getPhone());
        User user = userMapper.selectOne(wrapper);
        // 7. 不存在  --->  自动注册
        if(user == null){
            user = new User();
            user.setPhone(phone);
            userMapper.insert(user);
        }
        // 将user对象封装为UserFTO，这样只暴露出用户的不重要的信息，更加安全
        UserDTO userDTO = new UserDTO();
        BeanUtil.copyProperties(user,userDTO);
        // 9. 将UserDTO对象信息存储到session中
        session.setAttribute(Constant.LOGIN_USER,userDTO);
        // 10. 返回结果
        return Result.ok();
    }

    @Override
    public Result getInfo() {
        UserDTO user = UserDTOThreadLocal.getInfo();
        log.info(user.toString());
        return Result.ok(user);
    }
}
